package heima_bixiangdong.daemon;


//演示停止线程。
class Demo implements Runnable {
    private boolean flag = true;

    public synchronized void run() {
        while (flag) {
            try {
                wait();//t1  t2
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().toString() + "....." + e.toString());
                changeFlag();
            }


            System.out.println(Thread.currentThread().getName() + "----->");
        }
    }

    //对标记的修改方法。
    public void changeFlag() {
        flag = false;
    }
}

/**
 3，守护线程：也可以理解为后台线程，之前创建的都是前台线程。
 只要线程调用了setDaemon(true);就可以把线程标记为守护线程。
 前台后台线程运行时都是一样的，获取CPU的执行权执行。
 只有结束的时候有些不同。
 前台线程要通过run方法结束，线程结束。
 后台线程也可以通过run方法结束，线程结束，还有另一种情况，
 当进程中所有的前台线程都结束了，这时无论后台线程处于什么样的状态，都会结束，从而进程会结束。
 进程结束依赖的都是前台线程。
 */
public class DaemonThread {
    public static void main(String[] args) {
        Demo d = new Demo();
        Thread t1 = new Thread(d, "旺财");
        Thread t2 = new Thread(d, "小强");
        t1.start();
        //t2.start();
        // 将t2线程设置成守护线程，当所有的前台线程（main,t1）都结束后，此时守护线程无论处于什么状态，都会自动结束
        t2.setDaemon(true);
        t2.start();
        int x = 0;
        while (true) {
            if (++x == 50)//条件满足。
            {
                //d.changeFlag();//改变线程任务代码的标记，让其他线程也结束。
                //对t1线程对象进行中断状态的清除，强制让其恢复到运行状态。
                t1.interrupt();
                //对t2线程对象进行中断状态的清除，强制让其恢复到运行状态。
                //t2.interrupt();
                break;//跳出循环，主线程可以结束。
            }
            System.out.println("main-------->" + x);
        }
        System.out.println("over");
    }
}

